package com.keshan.controller;

import com.alibaba.druid.util.StringUtils;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.keshan.pojo.MdUser;
import com.keshan.pojo.UserDevice;
import com.keshan.service.MdUserServices;
import com.keshan.service.UserDeviceServices;
import com.keshan.utils.JWTUtils;
import com.keshan.utils.Msg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author keshan
 * @date 2022/10/18 - 10:03
 */
@CrossOrigin
@Controller
@RequestMapping("/mduser")
public class MdUserController {

    @Autowired
    MdUserServices mdUserServices;
    @Autowired
    UserDeviceServices userDeviceServices;

//    JWTInterceptor JWT;

    /**
     * 所有方法，
     * 第一个是注册，做出返回，然后前端跳转登录界面
     * 第二个是登录，登录成功后给前端token，前端进行页面跳转
     * 第三个是实名认证 ，如果token没有，那么就是跳转登录，如果有的话，就解析token,插入/更新数据
     * 第四个是设备绑定 ，如果token没有，那么就是跳转登录，如果有的话，就解析token,插入数据，然后返回新的包含imei
     * 的token
     * 剩下的是所有查询方法，如果token没有，那么就是跳转登录，如果有的话，就解析token,查询数据
     */


    /**
     * 登录方法
     *
     * @param mdUser
     * @return
     * @RequestBody 这个注解是变成自己想要的类必须的，不要忘了写
     */
    @RequestMapping("/login")
    @ResponseBody
    public Msg loginByUsernameAndPassword(@RequestBody MdUser mdUser) {
        //实际上是不需要进行exception的，因为查不到的结果，也不过是空，是不报错的，但是
        System.out.println(mdUser.toString());
        List<MdUser> mdUserList = mdUserServices.getMdUserListByMduser(mdUser);
        if (mdUserList.size() == 0) {
            return Msg.failLogin();
        } else {
            //生成jwt令牌
            Map<String, String> payload = new HashMap<>();
//            System.out.println(mdUserList.get(0).getUsername().toString());  是的，拿到的是对的
            payload.put("username", mdUserList.get(0).getUsername());
            String token = JWTUtils.getToken(payload);
            return Msg.successLogin().add("token", token);
        }

    }

    /**
     * 注册方法
     *
     * @param mdUser
     * @return
     */
    @RequestMapping("/register")
    @ResponseBody
    public Msg registerByUsernameAndPassword(@RequestBody MdUser mdUser) {
        System.out.println(mdUser.toString());
        try {
            mdUserServices.insertBySelectiveMdUser(mdUser);
        } catch (Exception e) {
            return Msg.failRegister().add("state", e.getMessage());
        }
        return Msg.successRegister();
    }

    /**
     * 放入拦截器中使用，这里不做修改
     * token验证方法
     *
     * @param httpServletRequest
     * @return
     */
    @RequestMapping("/test")
    @ResponseBody
    public Msg test(HttpServletRequest httpServletRequest) {
        Map<String, String> map = new HashMap<>();
        String token = httpServletRequest.getHeader("token");
        try {
            DecodedJWT decodedJWT = JWTUtils.verifyAndInfo(token);
            System.out.println(decodedJWT.getClaim("username").asString());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return Msg.success();

    }


    /**
     * 实名认证方法
     *
     * @param mdUser
     * @return
     */
    @RequestMapping("/updateRealName")
    @ResponseBody
    public Msg updateRealNameByMdUser(@RequestBody MdUser mdUser) {
        try {
            mdUserServices.updateMdUserByPrimaryKeySelective(mdUser);
        } catch (Exception e) {
            return Msg.fail().add("state", e.getMessage());
        }
        return Msg.success();
    }

    /**
     * @param userDevice 设备号和设备类型
     * @param token      用户标识
     * @return Msg
     * @author tangzheng
     * @date 2023/2/10 18:40
     * @description 用户绑定设备
     */
    @RequestMapping("/bindDevice")
    @ResponseBody
    public Msg bindDevice(@RequestBody UserDevice userDevice, @RequestHeader String token) {
        String imei = userDevice.getImei();
        if (StringUtils.isEmpty(imei)) {
            return Msg.fail("设备号异常");
        }
        try {
            DecodedJWT decodedJWT = JWTUtils.verifyAndInfo(token);
            String username = decodedJWT.getClaim("username").asString();
            userDevice.setUsername(username);
            //唐铮20230210：若该用户已绑定该类型设备或者该设备已被其他用户绑定，则视为绑定失败
            if (userDeviceServices.isExistByImei(imei)) {
                return Msg.fail("该设备已被绑定");
            } else if (userDeviceServices.isExitsByTypeAndUser(userDevice)) {
                return Msg.fail("已存在相同型号的设备");
            } else {
                userDeviceServices.insertSelective(userDevice); //插入设备关系
                return Msg.success();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return Msg.fail("系统异常");
        }
    }

    /**
     * @param userDevice 设备号和设备类型
     * @param token      用户标识
     * @return Msg
     * @author tangzheng
     * @date 2023/2/10 18:40
     * @description 用户解绑设备
     */
    @RequestMapping("/unbindDevice")
    @ResponseBody
    public Msg unbindDevice(@RequestBody UserDevice userDevice, @RequestHeader String token) {
        String imei = userDevice.getImei();
        if (StringUtils.isEmpty(imei)) {
            return Msg.fail("设备号异常");
        }
        try {
            String username = JWTUtils.verifyAndInfo(token).getClaim("username").asString();
            userDevice.setUsername(username);
            userDeviceServices.deleteSelective(userDevice);
            return Msg.success();
        } catch (Exception e) {
            e.printStackTrace();
            return Msg.fail("系统异常");
        }
    }

    /**
     * @param token 用户标识
     * @return Msg
     * @author tangzheng
     * @date 2023/2/10 18:40
     * @description 查询设备列表
     */
    @RequestMapping("/selectDeviceList")
    @ResponseBody
    public Msg selectDeviceByUsername(@RequestHeader String token) {
        try {
            DecodedJWT decodedJWT = JWTUtils.verifyAndInfo(token);
            String username = decodedJWT.getClaim("username").asString();
            List<UserDevice> userDeviceList = userDeviceServices.getUserDeviceListByUsername(username);
            return Msg.success().add("userDeviceList", userDeviceList);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return Msg.fail("查询失败");
        }
    }

    /**
     * @author tangzheng
     * @date 2023/2/11 22:52
     * @description 用户自主更改用户相关信息
     * @param token 用户token
     * @param user 需要更改的信息
     * @return com.keshan.utils.Msg
     */
    @PostMapping("updateUser")
    @ResponseBody
    public Msg updateUser(@RequestHeader String token,@RequestBody MdUser user){
        try {
            DecodedJWT decodedJWT = JWTUtils.verifyAndInfo(token);
            String username = decodedJWT.getClaim("username").asString();
            user.setUsername(username);
            mdUserServices.updateByUsernameSelective(user);
            return Msg.success();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return Msg.fail("系统出错");
        }
    }
}
